#include <fstream>
#include <mutex>
#include <iostream>

class Logger {
public:
    static Logger& getInstance() {
        static Logger instance; // C++11线程安全
        return instance;
    }

    void log(const std::string& message) {
        std::lock_guard<std::mutex> lock(mutex_);
        logFile_ << message << std::endl;
    }

private:
    Logger() : logFile_("app.log") {}
    ~Logger() { logFile_.close(); }

    std::ofstream logFile_;
    std::mutex mutex_;
};

// 使用示例
// 1. 日志系统
// 场景：整个程序需要统一的日志输出，避免多实例导致日志混乱。
// 特点：
// 全局唯一实例，确保日志顺序性。
// 使用std::lock_guard保证线程安全。
// 自动管理文件资源（RAII）。
int main() {
    Logger::getInstance().log("Application started");
    Logger::getInstance().log("Processing request...");
    return 0;
}


// 总结
// 场景	        单例优势	                        实现方式推荐
// 日志系统	    全局唯一输出，避免多实例冲突	    C++11 局部静态变量
// 配置管理	    统一配置存储，延迟加载	            饿汉式或懒汉式
// 连接池	    复用资源，控制并发连接数	        懒汉式 + 智能指针
// 线程池	    全局任务调度，资源复用	            C++11 局部静态变量
// 渲染引擎	    唯一硬件上下文，避免资源竞争	    饿汉式或懒汉式